package com.bibimaya.auto.mapper.dao.utils;

import com.bibimaya.auto.mapper.dao.constant.Const;

/**
 * InsertSqlUtil
 * Created by lijianwei
 */
public class InsertSqlUtil {

    public static String insertSql(Class entityClass) {
        return insertSql(EntityMap.newInstance(entityClass, null));
    }

    public static String insertSql(Class entityClass, String suffix) {
        return insertSql(EntityMap.newInstance(entityClass, suffix));
    }

    public static String insertSql(EntityMap entityMap){
        String tableName = entityMap.getTable();
        StringBuffer fristPartSql = new StringBuffer("<script>");
        fristPartSql.append(Const.NEW_LINE);
        fristPartSql.append(Const.TAB).append("insert into ").append(tableName);
        fristPartSql.append(Const.NEW_LINE);
        fristPartSql.append(Const.TAB).append("<trim prefix='(' suffix=')' suffixOverrides=',' >");
        fristPartSql.append(Const.NEW_LINE);

        StringBuffer afterPartSql = new StringBuffer();
        afterPartSql.append(Const.TAB).append("<trim prefix='values (' suffix=')' suffixOverrides=',' >");
        afterPartSql.append(Const.NEW_LINE);
        String tab = Const.TAB + Const.TAB;
        for (int i = 0; i < entityMap.getFields().size(); i++) {
            FieldMap fm = entityMap.getFields().get(i);
            fristPartSql.append(insertFieldColSql(fm, tab));
            afterPartSql.append(insertFieldValSql(fm, tab));
        }
        fristPartSql.append(Const.TAB);
        fristPartSql.append("</trim>");
        fristPartSql.append(Const.NEW_LINE);

        afterPartSql.append(Const.TAB);
        afterPartSql.append("</trim>");
        afterPartSql.append(Const.NEW_LINE);
        afterPartSql.append("</script>");
        return fristPartSql.append(afterPartSql).toString();
    }

    public static String insertListSql(Class entityClass){
        return insertListSql(EntityMap.newInstance(entityClass, null));
    }

    public static String insertListSql(EntityMap entityMap) {
        StringBuffer sql = new StringBuffer();
        sql.append("<script>");
        sql.append(Const.NEW_LINE);
        sql.append(Const.TAB);
        sql.append("insert into " + entityMap.getTable());
        sql.append("(");
        for (int i = 0; i < entityMap.getFields().size(); i++) {
            FieldMap fm = entityMap.getFields().get(i);
            sql.append(Const.NEW_LINE);
            sql.append(Const.TAB).append(Const.TAB);
            sql.append("`"+fm.getColumn()+"`");
            if (i < entityMap.getFields().size() - 1) {
                sql.append(",");
            }
        }
        sql.append(Const.NEW_LINE);
        sql.append(Const.TAB);
        sql.append(")");
        sql.append(Const.NEW_LINE);
        sql.append(Const.TAB);
        sql.append("values");
        sql.append(Const.NEW_LINE);
        sql.append(Const.TAB);
        sql.append("<foreach collection='list' item='entity' separator=','>");
        sql.append(Const.NEW_LINE);
        sql.append(Const.TAB);
        sql.append("(");
        for (int i = 0; i < entityMap.getFields().size(); i++) {
            FieldMap fm = entityMap.getFields().get(i);
            sql.append(Const.NEW_LINE);
            sql.append(Const.TAB).append(Const.TAB);
            sql.append("#{entity.").append(fm.getField()).append("}");
            if (i < entityMap.getFields().size() - 1) {
                sql.append(",");
            }
        }
        sql.append(Const.NEW_LINE);
        sql.append(Const.TAB);
        sql.append(")");
        sql.append(Const.NEW_LINE);
        sql.append(Const.TAB);
        sql.append("</foreach>");
        sql.append(Const.NEW_LINE);
        sql.append("</script>");
        return sql.toString();
    }

    public static String insertFieldColSql(FieldMap fm, String tab){
        if(fm == null){
            return Const.STR_EMPTY;
        }
        tab = tab == null ? Const.STR_EMPTY : tab;
        StringBuffer sql = new StringBuffer();
        sql.append(tab);
        sql.append("<if test='" + fm.getField() + "!= null'>");
        sql.append(Const.NEW_LINE);
        sql.append(tab).append(Const.TAB);
        sql.append("`"+fm.getColumn()+"`").append(",");
        sql.append(Const.NEW_LINE);
        sql.append(tab);
        sql.append("</if>");
        sql.append(Const.NEW_LINE);
        return sql.toString();
    }

    public static String insertFieldValSql(FieldMap fm, String tab){
        if(fm == null){
            return Const.STR_EMPTY;
        }
        String tabTmp = tab == null ? Const.STR_EMPTY : tab;
        StringBuffer sql = new StringBuffer();
        sql.append(tabTmp);
        sql.append("<if test='" + fm.getField() + " != null'>");
        sql.append(Const.NEW_LINE);
        sql.append(tabTmp).append(Const.TAB);
        sql.append("#{").append(fm.getField()).append("}").append(",");
        sql.append(Const.NEW_LINE);
        sql.append(tabTmp);
        sql.append("</if>");
        sql.append(Const.NEW_LINE);
        return sql.toString();
    }
}
